// 顺序存储的串

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    char *ch;
    int length;
} String;

// 初始化串
void initString(String *s)
{
    s->ch = NULL;
    s->length = 0;
}

// 串赋值
void strAssign(String *s, char *t)
{
    int i;
    if (s->ch)
    {
        free(s->ch);
    }
    // 通过 i 计算字符数组的长度
    for (i = 0; t[i] != '\0'; i++)
    {
        ;
    }
    if (!i)
    {
        s->ch = NULL;
        s->length = 0;
    }
    else
    {
        s->ch = (char *)malloc(sizeof(char) * i);
        for (i = 0; t[i] != '\0'; i++)
        {
            s->ch[i] = t[i];
        }
        s->length = i;
    }
}

// 串比较
// 如果相等，返回 0，如果按位的 ascii 返回非零值
int strCompare(String s1, String s2)
{
    for (int i = 0; i < s1.length; i++)
    {
        if (s1.ch[i] != s2.ch[i])
        {
            return s1.ch[i] - s2.ch[i] > 0 ? 1 : -1;
        }
    }
    return 0;
}


// 串连接
void strConcat(String *s, String *s1, String *s2)
{
    int i;
    if (s->ch)
    {
        free(s->ch);
    }
    s->ch = (char *)malloc(sizeof(char) * (s1->length + s2->length));
    for (i = 0; i < s1->length; i++)
    {
        s->ch[i] = s1->ch[i];
    }
    for (i = 0; i < s2->length; i++)
    {
      s->ch[i + s1->length] = s2->ch[i];
    }
    s->length = s1->length + s2->length;
}

// 截取子串
void substr(String str, int start, int end, String *sub)
{
    *sub = str;
    sub->length = end - start;
    sub->ch = (char *)malloc(sizeof(char) * sub->length);
    for (int i = start; i < end; i++)
    {
        sub->ch[i - start] = str.ch[i];
    }
}

// 测试串连接
void testConcat()
{
    String s1, s2, s;
    int i;
    initString(&s1);
    initString(&s2);
    initString(&s);
    strAssign(&s1, "Hello ");
    strAssign(&s2, "World");
    strConcat(&s, &s1, &s2);
    for (i = 0; i < s.length; i++)
    {
        printf("%c", s.ch[i]);
    }
    printf("\n");
}

void testCompare()
{
    String s1, s2, s3;
    initString(&s1);
    initString(&s2);
    initString(&s3);
    strAssign(&s1, "Hello");
    strAssign(&s2, "Hello");
    strAssign(&s3, "World");
    printf("\n字符串比较: 0: 字符相等, 1: 排序靠后, -1: 排序靠前\n");
    printf("Compare Hello and Hello: %d\n", strCompare(s1, s2));
    printf("Compare Hello and World: %d\n", strCompare(s1, s3));
}

void testSubstr()
{
    String str, sub;
    int i;
    initString(&str);
    initString(&sub);
    printf("\n字符串截取子串, 35022120051010031X 截取 6-14为的结果为:\n");
    strAssign(&str, "35022120051010031X");
    substr(str, 6, 14, &sub);
    for (i = 0; i < sub.length; i++)
    {
        printf("%c", sub.ch[i]);
    }
    printf("\n");
}

int main(int i)
{
    // 测试串连接
    testConcat();
    // 测试串比较
    testCompare();

    // 测试取子串
    testSubstr();
    
    system("pause");
    return 0;
}
void printStr(String str) 
{
   for (int i = 0; i < str.length; i ++) 
   {
    printf("%c", str.ch[i]);
   }
   printf("\n");
}

// int main() 
// {
//     String testAssign;
//     strAssign(&testAssign, "Hello");
//     printStr(testAssign);
//     system("pause");
//     return 1;
// }
